package main;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Vector;
/**
 * Manejador (hanlder) para archivos de typo Arff. Abre un archivo y carga las linea abacho el atributo "@data" en un vector. Ademas facilita
 * carga un vector en un nuevo archivo con el mismo cabeza (header).
 * @author Michel Jensen, 11.03.2010
 *
 */
public class ArffFileHandler {

	private BufferedReader in;
	private BufferedWriter out;
	private String filePath;
	private int lineNumber;
	private String header;
	private Vector<String> data;

	/**
	 * Constructor
	 * @param path Nombre de archivo 
	 * @param data Referencia a el vector para las datos
	 */
	public ArffFileHandler(String path, Vector<String> data) {
		this.filePath = path;
		this.data = data;
		openFile();
		readFile();
	}
	
	/**
	 * Carga un copia de archivo con los datos en la vector.
	 */
	public void saveCopyOfFile(){
		try {
			String[] path = filePath.split("\\.");
			this.out = new BufferedWriter(new FileWriter(path[0] + " Modified." + path[1]));
			this.out.write(this.header);
			for (String s : this.data) {	
				this.out.write(s + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Corre el archivo y las buffers.
	 */
	public void closeFile(){
		try{
			this.in.close();
			this.out.close();
			this.filePath = "";
		} catch(IOException e){
			System.out.printf("Error cerrar el archivo: %s\n\n", filePath);
//			System.out.printf("Error closing file: %s\n\n", filePath);
			System.exit(-1);
		}
	}
	
	private void readFile (){
		readHeader();
		readData();
	}
	
	private void readHeader(){
		String currentLine = "";
		this.header = "";
		while (!currentLine.startsWith("@data")) {
			try {
				currentLine = in.readLine();
				this.lineNumber++;
				this.header += currentLine + "\n";
			} catch (IOException e) {
				System.out.printf("Error leer linea numero %d en el archivo %s\n\n", lineNumber, filePath);
//				System.out.printf("Error reading line number %d in file %s\n\n", lineNumber, filePath);
				closeFile();
				System.exit(-1);	// Sale el aplicacion porque un insperado error  (Exit the program due to an unexpected error)
			}
		}
	}
	
	private void readData(){
		String currentLine = "";
		while (currentLine != null) {
			if(!currentLine.startsWith("%")){
					try {
						currentLine = in.readLine();
						this.lineNumber++;
						this.data.add(currentLine);
					} catch (IOException e) {
						closeFile();
						System.exit(-1);	// Sale el aplicacion porque un insperado error
					}
			}else this.lineNumber++;
		}
	}
	
	private void openFile(){
		try{
			this.lineNumber = 0;
			this.in = new BufferedReader(new FileReader(filePath));
		} catch(IOException e){
			System.out.println("Error abiertar el archivo: " + filePath);
//			System.out.println("Error opening file: " + filePath);
			closeFile();
			System.exit(-1);
		}
	}
	
	@Override
	protected void finalize() throws Throwable {
		closeFile();
		super.finalize();
	}

	public int getLineNumber(){
		return this.lineNumber;
	}
}
